// fun(a,b,c)->fun(a)(b)(c)

// 第一版
// function curry(fun) {
//   return function curried(...args) {
//     if (args.length >= fun.length) {
//       return fun.apply(this, args);
//     } else {
//       return function (...args2) {
//         return curried.apply(this, args.concat(args2));
//       };
//     }
//   };
// }

// 第二版
// 相对于第一版解决掉了this指向丢失的问题，并且简化代码为一行。
function curry(fun){
  return function curried(...args){
    return args.length>=fun.length?fun.apply(this,args):(...args2)=>curried.apply(this,args.concat(args2))
  }
}
// 难点在于利用闭包保存参数和函数不断调用curried函数，当参数齐全时候返回函数调用结果，参数不齐全的时候返回一个包含前面所有参数的函数，并把前面所有的参数加上新输入的参数一起调用curried看参数是否齐全
function hello(name, age, birthday) {
  console.log(
    `hello i am ${name} and ${age} years old so my birthday is ${birthday}`
  );
}
const curriedHello = curry(hello);
curriedHello("jack", 10, 2015);
curriedHello("jack")(10, 2015);
curriedHello("jack")(10)(2015);
